library(tidyverse)     # for graphing and data cleaning
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5     ✓ purrr   0.3.4
## ✓ tibble  3.1.6     ✓ dplyr   1.0.8
## ✓ tidyr   1.1.4     ✓ stringr 1.4.0
## ✓ readr   2.1.1     ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(lubridate)     # for date manipulation
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(ggthemes)      # for even more plotting themes
library(gganimate)     # for adding animation layers to ggplots
library(RColorBrewer)  # for color palettes
library(viridis)
## Loading required package: viridisLite
library(plotly)        # for the ggplotly() - basic interactivity
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(gganimate)     # for adding animation layers to ggplots
library(transformr)    # for "tweening" (gganimate)
library(gifski)        # need the library for creating gifs but don't need to load each time
library(gt)
library(maps)
## 
## Attaching package: 'maps'
## The following object is masked from 'package:viridis':
## 
##     unemp
## The following object is masked from 'package:purrr':
## 
##     map
library(ggmap)
## Google's Terms of Service: https://cloud.google.com/maps-platform/terms/.
## Please cite ggmap if you use it! See citation("ggmap") for details.
## 
## Attaching package: 'ggmap'
## The following object is masked from 'package:plotly':
## 
##     wind
theme_set(theme_minimal()) # My favorite ggplot() theme :)
freq_theme_words <- read.csv("https://raw.githubusercontent.com/the-pudding/data/master/women-in-headlines/word_themes_freq.csv")
freq_country_words <- read.csv("https://raw.githubusercontent.com/the-pudding/data/master/women-in-headlines/word_country_freq.csv")
headline_site <- read.csv("https://raw.githubusercontent.com/the-pudding/data/master/women-in-headlines/headlines_site.csv")
word_theme_rank <- read.csv("https://raw.githubusercontent.com/the-pudding/data/master/women-in-headlines/word_themes_rank.csv")
headline_examples <- read.csv("https://raw.githubusercontent.com/the-pudding/data/master/women-in-headlines/headlines.csv")
polarity_site <- read.csv("https://raw.githubusercontent.com/the-pudding/data/master/women-in-headlines/polarity_comparison_site_country_time.csv")
polarity_over_time <- read.csv("https://raw.githubusercontent.com/the-pudding/data/master/women-in-headlines/polarity_comparison_country_time.csv")

Data was taken from news sites from four different countries with varying numbers of news sources used. From the United States of America, 86 new sites were used. From the United Kingdom, 41 news sites were used. From South Africa, 23 news sites were used. From India, 36 news sites were used. The data taken involved the frequency of words used sorted by theme and frequency of words by country. The themes are crime and violence, empowerment, female stereotypes, people and places, race, ethnicity and identity, and no theme. The words were also ranked by theme based on frequency of word use. The news sites were also assigned values for bias and polarity, the calculations are explained at the bottom of the article. There are also headline examples which are individually given a bias score.

world_map <- map_data("world")

headline_site %>% 
  group_by(country_of_pub) %>% 
  summarise(bias_country = mean(bias)) %>% 
  ggplot() +
    geom_map(data = world_map, map = world_map,
             aes(long, lat, map_id = region),
             fill = "lightgray")+
    geom_map(map = world_map,
            aes(map_id = `country_of_pub`),
            fill = "springgreen4",
            color = "springgreen4")+
    expand_limits(x = world_map$long, y = world_map$lat) + 
    theme_map()
## Warning: Ignoring unknown aesthetics: x, y

A world map with the USA, the UK, South Africa, and India colored in green to signify where data was taken from.

The average bias of news sites often varies from the minimum and maximum bias values given to different headlines. The following column chart displays the mean bias by country along with the maximum bias of a headline published by a site in the country. The minimum bias score is zero for all countries so no visual representation was added.

headline_site %>%
  group_by(country_of_pub) %>%
  summarize(mean_bias = mean(bias), max_bias = max(bias)) %>% 
  ggplot()+
  geom_col(aes(y = country_of_pub, x = max_bias), fill = "lightblue2", width = .75)+
  geom_col(aes(y = country_of_pub, x = mean_bias), width = .5, fill = "tan2")+
  scale_x_continuous(limits = c(0, 1))+
  labs(title = "Average and Maximum Bias Score by Country",
       x = "Bias",
       y = "Country of Publication")+
  theme(plot.title = element_text(hjust = 0.5))

A cumulative bar graph for the words used to describe women used in headlines. They are divided into 5 main categories with crime and violence having the most words and the highest frequency. The graph is interactive so each word can be highlighted with the individual word and frequency.

pivot_words <- freq_theme_words %>% 
  pivot_longer(cols = -theme,
               names_to = "word",
               values_to = "freq") %>% 
  na.omit()

word_plot <- pivot_words %>% 
  filter(theme != "No theme") %>% 
  ggplot(aes(x = theme, 
             y = freq, 
             fill = fct_reorder(word, freq),
             text = paste("word:", word))) +
    geom_col(color = "black") +
    theme(legend.position = "none") +
    # scale_fill_manual(values = c("darkslateblue", "lightblue2", "tan2"),
    #                   breaks = waiver())+
    labs(title = "Cumulative Frequency of Words describing Women in Headlines",
       x = "",
       y = "Frequency")+
    theme(plot.title = element_text(hjust = 0.5))


ggplotly(word_plot,
         tooltip = c("y", "text"))

The words taken from headlines across different news sites were sorted into theme categories and ranked by occurrence. The following column chart describes the top five words used sorted by theme with the word ‘man’ appearing almost triple the average word use. Crime and violence have the highest average word count of any theme.

word_theme_rank %>% 
  filter(`rank` < 6) %>% 
  select(!`X`) %>% 
  ggplot(aes(y = fct_reorder(word, theme), x = count)) +
  geom_col(aes(fill = theme))+
  scale_fill_viridis_d(option = "viridis") +
  #theme(legend.position = "none")+
  theme(plot.title = element_text(hjust = 0.5))+
  labs(title = "Count of Top 5 words per Theme",
       y = "",
       x = "")

The average polarity of news headlines in regards to women has been higher for the past ten years. I am unsure how to describe polarity well.

polarity_over_time %>% 
  group_by(`year`) %>% 
  summarise(women_mean = mean(`women_polarity_mean`),
            all_mean = mean(`all_polarity_mean`),
            year) %>% 
  ggplot()+
  geom_smooth(aes(x=`year`, y=`women_mean`), color = "springgreen4", se = FALSE)+
  geom_smooth(aes(x=`year`, y=`all_mean`), color = "black", se = FALSE)+
  geom_point(aes(x=2020.0, y=0.425), 
             color = "black", fill = "springgreen4", 
             size = 5, stroke = 2, shape = 21) +
  geom_point(aes(x=2020.0, y=0.28), size = 2.5)+
  geom_label(label = "Headlines about\nwomen", x= 2019.4, y=0.40, color = "springgreen4")+
  geom_label(label = "Headlines about\nother topics", x=2019.4, y= 0.25)+
  scale_x_continuous(breaks = c(2010, 2012, 2014, 2016, 2018, 2020))+
  labs(title = "Average of Polarity of News Headlines over Time",
       y = "",
       x = "")+
  theme(plot.title = element_text(hjust = 0.5),
        panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_blank(),
        axis.line.x = element_line(color = "black"))
## `summarise()` has grouped output by 'year'. You can override using the
## `.groups` argument.
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Polarity from sites, base polarity (black) to women polarity (green) with the differences as a line segment, they are ordered by polarity of women value, not by differences

polarity_site %>% 
  ggplot()+
  geom_segment(aes(x=polarity_base, xend=polarity_women, y=fct_reorder(site, polarity_women), yend=site), size = 1)+
  geom_point(aes(x=polarity_base, y = site), size = 2)+
  geom_point(aes(x=polarity_women, y = site), color = "black", fill = "springgreen4", 
             size = 3, stroke = 1, shape = 21)+
  labs(title = "Polarity of News Outlines:\n Headlines about Women vs. Headlines about other topics",
       y = "",
       x = "Polarity")+
  theme(plot.title = element_text(hjust = 0.5))

Three examples of headlines with no calculated bias

last_three_headlines <- headline_examples %>% 
  rename("Headline" = `headline_no_site`,
         "Site" = `site`,
         "Country" = `country`,
         "Bias" = `bias`) %>%
  arrange(`Bias`) %>%
  distinct(Site, .keep_all = TRUE) %>% 
  slice(1:3) %>% 
  select(`Headline`, `Site`, `Country`, `Bias`)

last_three_headlines_table <- gt(last_three_headlines) %>% 
  tab_header(title = "Least Biased Headline Examples") %>% 
  data_color(columns = vars(`Headline`, `Site`, `Country`, `Bias`), 
             colors = '#bccae0')
## Warning: `columns = vars(...)` has been deprecated in gt 0.3.0:
## * please use `columns = c(...)` instead
last_three_headlines_table
Least Biased Headline Examples
Headline Site Country Bias
'Lady Bird' buzzes through young sexuality iol.co.za South Africa 0
American Woman, Divorced From Saudi Husband, Is Trapped in Saudi Arabia msn.com India 0
'SA poorer without her' SACP reacts to Madikizela Mandela's death News24.com South Africa 0

Three examples of highly biased headlines

top_three_headlines <- headline_examples %>% 
  rename("Headline" = `headline_no_site`,
         "Site" = `site`,
         "Country" = `country`) %>% 
  mutate(Bias = round(bias, digits = 3)) %>% 
  arrange(desc(`Bias`)) %>%
  distinct(Site, .keep_all = TRUE) %>% 
  slice(1:3) %>% 
  select(`Headline`, `Site`, `Country`, `Bias`)

top_three_headlines_table <- gt(top_three_headlines) %>% 
  tab_header(title = "Most Biased Headline Examples") %>% 
  data_color(columns = vars(`Headline`, `Site`, `Country`, `Bias`), 
             colors = '#bccae0')
## Warning: `columns = vars(...)` has been deprecated in gt 0.3.0:
## * please use `columns = c(...)` instead
top_three_headlines_table
Most Biased Headline Examples
Headline Site Country Bias
Girl with severe eczema told her mum she 'didn't want to look at herself in the mirror' she's now a model manchestereveningnews.co.uk UK 1.000
A Mother Said Her 9 Year Old Daughter Killed Herself Because She Was Bullied For Being Friends With A White Boy buzzfeed.com UK 0.833
Wuthering Heights actress Merle Oberon's secret that she took to the grave... her sister was her mother who ga dailymail.co.uk India 0.833

POLARITY CALCULATIONS We measure polarity by performing sentiment analysis on each headline using the Vader python package, where each headline gets a sentiment score from -1 to 1 (from more negative to more positive). Because we are interested in polarity, we take the absolute value of each headline’s score.

BIAS CALCULATIONS We measure gender bias by tracking the combined occurrence of gendered language and social stereotypes usually associated with women. We do this in two steps: 1) We check if a headline contains gendered language (i.e. “spokeswoman,” “chairwoman,” “she,” “her,” “bride,” “daughter,” “daughters,” “female,” “fiancee,” “girl,” “girlfriend” etc.). 2) If it contains gendered language, we then count the number of words that are considered to be social stereotypes about women (i.e. “weak,” “modest,” “virgin,” “slut,” “whore,” “sexy,” “feminine,” “sensitive,” “emotional,” “gentle,” “soft,” “pretty,” “bitch,” “sexual” etc.). Finally, we normalize this count for all headlines within each outlet as a score between 0 and 1, and we aggregate (i.e. average) this score for each outlet. (site from pudding https://pudding.cool/2022/02/women-in-headlines/)

LS0tCnRpdGxlOiAiSGVhZGxpbmVzIgphdXRob3I6ICJBdWRyZXkgU215Y3playIKZGF0ZTogIjQvMTQvMjAyMiIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CiNrbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKYGBge3IgbGlicmFyaWVzfQpsaWJyYXJ5KHRpZHl2ZXJzZSkgICAgICMgZm9yIGdyYXBoaW5nIGFuZCBkYXRhIGNsZWFuaW5nCmxpYnJhcnkobHVicmlkYXRlKSAgICAgIyBmb3IgZGF0ZSBtYW5pcHVsYXRpb24KbGlicmFyeShnZ3RoZW1lcykgICAgICAjIGZvciBldmVuIG1vcmUgcGxvdHRpbmcgdGhlbWVzCmxpYnJhcnkoZ2dhbmltYXRlKSAgICAgIyBmb3IgYWRkaW5nIGFuaW1hdGlvbiBsYXllcnMgdG8gZ2dwbG90cwpsaWJyYXJ5KFJDb2xvckJyZXdlcikgICMgZm9yIGNvbG9yIHBhbGV0dGVzCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShwbG90bHkpICAgICAgICAjIGZvciB0aGUgZ2dwbG90bHkoKSAtIGJhc2ljIGludGVyYWN0aXZpdHkKbGlicmFyeShnZ2FuaW1hdGUpICAgICAjIGZvciBhZGRpbmcgYW5pbWF0aW9uIGxheWVycyB0byBnZ3Bsb3RzCmxpYnJhcnkodHJhbnNmb3JtcikgICAgIyBmb3IgInR3ZWVuaW5nIiAoZ2dhbmltYXRlKQpsaWJyYXJ5KGdpZnNraSkgICAgICAgICMgbmVlZCB0aGUgbGlicmFyeSBmb3IgY3JlYXRpbmcgZ2lmcyBidXQgZG9uJ3QgbmVlZCB0byBsb2FkIGVhY2ggdGltZQpsaWJyYXJ5KGd0KQpsaWJyYXJ5KG1hcHMpCmxpYnJhcnkoZ2dtYXApCnRoZW1lX3NldCh0aGVtZV9taW5pbWFsKCkpICMgTXkgZmF2b3JpdGUgZ2dwbG90KCkgdGhlbWUgOikKYGBgCgpgYGB7cn0KZnJlcV90aGVtZV93b3JkcyA8LSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3RoZS1wdWRkaW5nL2RhdGEvbWFzdGVyL3dvbWVuLWluLWhlYWRsaW5lcy93b3JkX3RoZW1lc19mcmVxLmNzdiIpCmZyZXFfY291bnRyeV93b3JkcyA8LSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3RoZS1wdWRkaW5nL2RhdGEvbWFzdGVyL3dvbWVuLWluLWhlYWRsaW5lcy93b3JkX2NvdW50cnlfZnJlcS5jc3YiKQpoZWFkbGluZV9zaXRlIDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vdGhlLXB1ZGRpbmcvZGF0YS9tYXN0ZXIvd29tZW4taW4taGVhZGxpbmVzL2hlYWRsaW5lc19zaXRlLmNzdiIpCndvcmRfdGhlbWVfcmFuayA8LSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3RoZS1wdWRkaW5nL2RhdGEvbWFzdGVyL3dvbWVuLWluLWhlYWRsaW5lcy93b3JkX3RoZW1lc19yYW5rLmNzdiIpCmhlYWRsaW5lX2V4YW1wbGVzIDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vdGhlLXB1ZGRpbmcvZGF0YS9tYXN0ZXIvd29tZW4taW4taGVhZGxpbmVzL2hlYWRsaW5lcy5jc3YiKQpwb2xhcml0eV9zaXRlIDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vdGhlLXB1ZGRpbmcvZGF0YS9tYXN0ZXIvd29tZW4taW4taGVhZGxpbmVzL3BvbGFyaXR5X2NvbXBhcmlzb25fc2l0ZV9jb3VudHJ5X3RpbWUuY3N2IikKcG9sYXJpdHlfb3Zlcl90aW1lIDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vdGhlLXB1ZGRpbmcvZGF0YS9tYXN0ZXIvd29tZW4taW4taGVhZGxpbmVzL3BvbGFyaXR5X2NvbXBhcmlzb25fY291bnRyeV90aW1lLmNzdiIpCmBgYAoKCmBgYHtyLCBlY2hvID0gRkFMU0V9CnBpdm90X2NvdW50cnlfd29yZCA8LSBmcmVxX2NvdW50cnlfd29yZHMgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzID0gLWNvdW50cnksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIndvcmQiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAibnVtYmVyIikgJT4lIAogIGZpbHRlcih3b3JkICE9ICJYIikgJT4lIAogIG5hLm9taXQoKQpgYGAKCgoKRGF0YSB3YXMgdGFrZW4gZnJvbSBuZXdzIHNpdGVzIGZyb20gZm91ciBkaWZmZXJlbnQgY291bnRyaWVzIHdpdGggdmFyeWluZyBudW1iZXJzIG9mIG5ld3Mgc291cmNlcyB1c2VkLiBGcm9tIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EsIDg2IG5ldyBzaXRlcyB3ZXJlIHVzZWQuIEZyb20gdGhlIFVuaXRlZCBLaW5nZG9tLCA0MSBuZXdzIHNpdGVzIHdlcmUgdXNlZC4gRnJvbSBTb3V0aCBBZnJpY2EsIDIzIG5ld3Mgc2l0ZXMgd2VyZSB1c2VkLiBGcm9tIEluZGlhLCAzNiBuZXdzIHNpdGVzIHdlcmUgdXNlZC4gVGhlIGRhdGEgdGFrZW4gaW52b2x2ZWQgdGhlIGZyZXF1ZW5jeSBvZiB3b3JkcyB1c2VkIHNvcnRlZCBieSB0aGVtZSBhbmQgZnJlcXVlbmN5IG9mIHdvcmRzIGJ5IGNvdW50cnkuIFRoZSB0aGVtZXMgYXJlIGNyaW1lIGFuZCB2aW9sZW5jZSwgZW1wb3dlcm1lbnQsIGZlbWFsZSBzdGVyZW90eXBlcywgcGVvcGxlIGFuZCBwbGFjZXMsIHJhY2UsIGV0aG5pY2l0eSBhbmQgaWRlbnRpdHksIGFuZCBubyB0aGVtZS4gVGhlIHdvcmRzIHdlcmUgYWxzbyByYW5rZWQgYnkgdGhlbWUgYmFzZWQgb24gZnJlcXVlbmN5IG9mIHdvcmQgdXNlLiBUaGUgbmV3cyBzaXRlcyB3ZXJlIGFsc28gYXNzaWduZWQgdmFsdWVzIGZvciBiaWFzIGFuZCBwb2xhcml0eSwgdGhlIGNhbGN1bGF0aW9ucyBhcmUgZXhwbGFpbmVkIGF0IHRoZSBib3R0b20gb2YgdGhlIGFydGljbGUuIFRoZXJlIGFyZSBhbHNvIGhlYWRsaW5lIGV4YW1wbGVzIHdoaWNoIGFyZSBpbmRpdmlkdWFsbHkgZ2l2ZW4gYSBiaWFzIHNjb3JlLgoKYGBge3IsIGZpZy5hbHQ9ICJBIHdvcmxkIG1hcCB3aXRoIHRoZSBVU0EsIHRoZSBVSywgU291dGggQWZyaWNhLCBhbmQgSW5kaWEgY29sb3JlZCBpbiBncmVlbiB0byBzaWduaWZ5IHdoZXJlIGRhdGEgd2FzIHRha2VuIGZyb20uIn0Kd29ybGRfbWFwIDwtIG1hcF9kYXRhKCJ3b3JsZCIpCgpoZWFkbGluZV9zaXRlICU+JSAKICBncm91cF9ieShjb3VudHJ5X29mX3B1YikgJT4lIAogIHN1bW1hcmlzZShiaWFzX2NvdW50cnkgPSBtZWFuKGJpYXMpKSAlPiUgCiAgZ2dwbG90KCkgKwogICAgZ2VvbV9tYXAoZGF0YSA9IHdvcmxkX21hcCwgbWFwID0gd29ybGRfbWFwLAogICAgICAgICAgICAgYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uKSwKICAgICAgICAgICAgIGZpbGwgPSAibGlnaHRncmF5IikrCiAgICBnZW9tX21hcChtYXAgPSB3b3JsZF9tYXAsCiAgICAgICAgICAgIGFlcyhtYXBfaWQgPSBgY291bnRyeV9vZl9wdWJgKSwKICAgICAgICAgICAgZmlsbCA9ICJzcHJpbmdncmVlbjQiLAogICAgICAgICAgICBjb2xvciA9ICJzcHJpbmdncmVlbjQiKSsKICAgIGV4cGFuZF9saW1pdHMoeCA9IHdvcmxkX21hcCRsb25nLCB5ID0gd29ybGRfbWFwJGxhdCkgKyAKICAgIHRoZW1lX21hcCgpCmBgYAoKClRoZSBhdmVyYWdlIGJpYXMgb2YgbmV3cyBzaXRlcyBvZnRlbiB2YXJpZXMgZnJvbSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBiaWFzIHZhbHVlcyBnaXZlbiB0byBkaWZmZXJlbnQgaGVhZGxpbmVzLiBUaGUgZm9sbG93aW5nIGNvbHVtbiBjaGFydCBkaXNwbGF5cyB0aGUgbWVhbiBiaWFzIGJ5IGNvdW50cnkgYWxvbmcgd2l0aCB0aGUgbWF4aW11bSBiaWFzIG9mIGEgaGVhZGxpbmUgcHVibGlzaGVkIGJ5IGEgc2l0ZSBpbiB0aGUgY291bnRyeS4gVGhlIG1pbmltdW0gYmlhcyBzY29yZSBpcyB6ZXJvIGZvciBhbGwgY291bnRyaWVzIHNvIG5vIHZpc3VhbCByZXByZXNlbnRhdGlvbiB3YXMgYWRkZWQuCgpgYGB7cn0KaGVhZGxpbmVfc2l0ZSAlPiUKICBncm91cF9ieShjb3VudHJ5X29mX3B1YikgJT4lCiAgc3VtbWFyaXplKG1lYW5fYmlhcyA9IG1lYW4oYmlhcyksIG1heF9iaWFzID0gbWF4KGJpYXMpKSAlPiUgCiAgZ2dwbG90KCkrCiAgZ2VvbV9jb2woYWVzKHkgPSBjb3VudHJ5X29mX3B1YiwgeCA9IG1heF9iaWFzKSwgZmlsbCA9ICJsaWdodGJsdWUyIiwgd2lkdGggPSAuNzUpKwogIGdlb21fY29sKGFlcyh5ID0gY291bnRyeV9vZl9wdWIsIHggPSBtZWFuX2JpYXMpLCB3aWR0aCA9IC41LCBmaWxsID0gInRhbjIiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSkrCiAgbGFicyh0aXRsZSA9ICJBdmVyYWdlIGFuZCBNYXhpbXVtIEJpYXMgU2NvcmUgYnkgQ291bnRyeSIsCiAgICAgICB4ID0gIkJpYXMiLAogICAgICAgeSA9ICJDb3VudHJ5IG9mIFB1YmxpY2F0aW9uIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKCkEgY3VtdWxhdGl2ZSBiYXIgZ3JhcGggZm9yIHRoZSB3b3JkcyB1c2VkIHRvIGRlc2NyaWJlIHdvbWVuIHVzZWQgaW4gaGVhZGxpbmVzLiBUaGV5IGFyZSBkaXZpZGVkIGludG8gNSBtYWluIGNhdGVnb3JpZXMgd2l0aCBjcmltZSBhbmQgdmlvbGVuY2UgaGF2aW5nIHRoZSBtb3N0IHdvcmRzIGFuZCB0aGUgaGlnaGVzdCBmcmVxdWVuY3kuIFRoZSBncmFwaCBpcyBpbnRlcmFjdGl2ZSBzbyBlYWNoIHdvcmQgY2FuIGJlIGhpZ2hsaWdodGVkIHdpdGggdGhlIGluZGl2aWR1YWwgd29yZCBhbmQgZnJlcXVlbmN5LgoKYGBge3J9CnBpdm90X3dvcmRzIDwtIGZyZXFfdGhlbWVfd29yZHMgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzID0gLXRoZW1lLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJ3b3JkIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImZyZXEiKSAlPiUgCiAgbmEub21pdCgpCgp3b3JkX3Bsb3QgPC0gcGl2b3Rfd29yZHMgJT4lIAogIGZpbHRlcih0aGVtZSAhPSAiTm8gdGhlbWUiKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gdGhlbWUsIAogICAgICAgICAgICAgeSA9IGZyZXEsIAogICAgICAgICAgICAgZmlsbCA9IGZjdF9yZW9yZGVyKHdvcmQsIGZyZXEpLAogICAgICAgICAgICAgdGV4dCA9IHBhc3RlKCJ3b3JkOiIsIHdvcmQpKSkgKwogICAgZ2VvbV9jb2woY29sb3IgPSAiYmxhY2siKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgICMgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZGFya3NsYXRlYmx1ZSIsICJsaWdodGJsdWUyIiwgInRhbjIiKSwKICAgICMgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gd2FpdmVyKCkpKwogICAgbGFicyh0aXRsZSA9ICJDdW11bGF0aXZlIEZyZXF1ZW5jeSBvZiBXb3JkcyBkZXNjcmliaW5nIFdvbWVuIGluIEhlYWRsaW5lcyIsCiAgICAgICB4ID0gIiIsCiAgICAgICB5ID0gIkZyZXF1ZW5jeSIpKwogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgoKZ2dwbG90bHkod29yZF9wbG90LAogICAgICAgICB0b29sdGlwID0gYygieSIsICJ0ZXh0IikpCmBgYAoKClRoZSB3b3JkcyB0YWtlbiBmcm9tIGhlYWRsaW5lcyBhY3Jvc3MgZGlmZmVyZW50IG5ld3Mgc2l0ZXMgd2VyZSBzb3J0ZWQgaW50byB0aGVtZSBjYXRlZ29yaWVzIGFuZCByYW5rZWQgYnkgb2NjdXJyZW5jZS4gVGhlIGZvbGxvd2luZyBjb2x1bW4gY2hhcnQgZGVzY3JpYmVzIHRoZSB0b3AgZml2ZSB3b3JkcyB1c2VkIHNvcnRlZCBieSB0aGVtZSB3aXRoIHRoZSB3b3JkICdtYW4nIGFwcGVhcmluZyBhbG1vc3QgdHJpcGxlIHRoZSBhdmVyYWdlIHdvcmQgdXNlLiBDcmltZSBhbmQgdmlvbGVuY2UgaGF2ZSB0aGUgaGlnaGVzdCBhdmVyYWdlIHdvcmQgY291bnQgb2YgYW55IHRoZW1lLiAKCmBgYHtyfQp3b3JkX3RoZW1lX3JhbmsgJT4lIAogIGZpbHRlcihgcmFua2AgPCA2KSAlPiUgCiAgc2VsZWN0KCFgWGApICU+JSAKICBnZ3Bsb3QoYWVzKHkgPSBmY3RfcmVvcmRlcih3b3JkLCB0aGVtZSksIHggPSBjb3VudCkpICsKICBnZW9tX2NvbChhZXMoZmlsbCA9IHRoZW1lKSkrCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInZpcmlkaXMiKSArCiAgI3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpKwogIGxhYnModGl0bGUgPSAiQ291bnQgb2YgVG9wIDUgd29yZHMgcGVyIFRoZW1lIiwKICAgICAgIHkgPSAiIiwKICAgICAgIHggPSAiIikKYGBgCgoKVGhlIGF2ZXJhZ2UgcG9sYXJpdHkgb2YgbmV3cyBoZWFkbGluZXMgaW4gcmVnYXJkcyB0byB3b21lbiBoYXMgYmVlbiBoaWdoZXIgZm9yIHRoZSBwYXN0IHRlbiB5ZWFycy4gCkkgYW0gdW5zdXJlIGhvdyB0byBkZXNjcmliZSBwb2xhcml0eSB3ZWxsLgoKYGBge3J9CnBvbGFyaXR5X292ZXJfdGltZSAlPiUgCiAgZ3JvdXBfYnkoYHllYXJgKSAlPiUgCiAgc3VtbWFyaXNlKHdvbWVuX21lYW4gPSBtZWFuKGB3b21lbl9wb2xhcml0eV9tZWFuYCksCiAgICAgICAgICAgIGFsbF9tZWFuID0gbWVhbihgYWxsX3BvbGFyaXR5X21lYW5gKSwKICAgICAgICAgICAgeWVhcikgJT4lIAogIGdncGxvdCgpKwogIGdlb21fc21vb3RoKGFlcyh4PWB5ZWFyYCwgeT1gd29tZW5fbWVhbmApLCBjb2xvciA9ICJzcHJpbmdncmVlbjQiLCBzZSA9IEZBTFNFKSsKICBnZW9tX3Ntb290aChhZXMoeD1geWVhcmAsIHk9YGFsbF9tZWFuYCksIGNvbG9yID0gImJsYWNrIiwgc2UgPSBGQUxTRSkrCiAgZ2VvbV9wb2ludChhZXMoeD0yMDIwLjAsIHk9MC40MjUpLCAKICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJzcHJpbmdncmVlbjQiLCAKICAgICAgICAgICAgIHNpemUgPSA1LCBzdHJva2UgPSAyLCBzaGFwZSA9IDIxKSArCiAgZ2VvbV9wb2ludChhZXMoeD0yMDIwLjAsIHk9MC4yOCksIHNpemUgPSAyLjUpKwogIGdlb21fbGFiZWwobGFiZWwgPSAiSGVhZGxpbmVzIGFib3V0XG53b21lbiIsIHg9IDIwMTkuNCwgeT0wLjQwLCBjb2xvciA9ICJzcHJpbmdncmVlbjQiKSsKICBnZW9tX2xhYmVsKGxhYmVsID0gIkhlYWRsaW5lcyBhYm91dFxub3RoZXIgdG9waWNzIiwgeD0yMDE5LjQsIHk9IDAuMjUpKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDIwMTAsIDIwMTIsIDIwMTQsIDIwMTYsIDIwMTgsIDIwMjApKSsKICBsYWJzKHRpdGxlID0gIkF2ZXJhZ2Ugb2YgUG9sYXJpdHkgb2YgTmV3cyBIZWFkbGluZXMgb3ZlciBUaW1lIiwKICAgICAgIHkgPSAiIiwKICAgICAgIHggPSAiIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIikpCmBgYAoKCgpQb2xhcml0eSBmcm9tIHNpdGVzLCBiYXNlIHBvbGFyaXR5IChibGFjaykgdG8gd29tZW4gcG9sYXJpdHkgKGdyZWVuKSB3aXRoIHRoZSBkaWZmZXJlbmNlcyBhcyBhIGxpbmUgc2VnbWVudCwgdGhleSBhcmUgb3JkZXJlZCBieSBwb2xhcml0eSBvZiB3b21lbiB2YWx1ZSwgbm90IGJ5IGRpZmZlcmVuY2VzCgpgYGB7ciwgZmlnLmhlaWdodD0gMjQsIGZpZy53aWR0aD0gOH0KcG9sYXJpdHlfc2l0ZSAlPiUgCiAgZ2dwbG90KCkrCiAgZ2VvbV9zZWdtZW50KGFlcyh4PXBvbGFyaXR5X2Jhc2UsIHhlbmQ9cG9sYXJpdHlfd29tZW4sIHk9ZmN0X3Jlb3JkZXIoc2l0ZSwgcG9sYXJpdHlfd29tZW4pLCB5ZW5kPXNpdGUpLCBzaXplID0gMSkrCiAgZ2VvbV9wb2ludChhZXMoeD1wb2xhcml0eV9iYXNlLCB5ID0gc2l0ZSksIHNpemUgPSAyKSsKICBnZW9tX3BvaW50KGFlcyh4PXBvbGFyaXR5X3dvbWVuLCB5ID0gc2l0ZSksIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJzcHJpbmdncmVlbjQiLCAKICAgICAgICAgICAgIHNpemUgPSAzLCBzdHJva2UgPSAxLCBzaGFwZSA9IDIxKSsKICBsYWJzKHRpdGxlID0gIlBvbGFyaXR5IG9mIE5ld3MgT3V0bGluZXM6XG4gSGVhZGxpbmVzIGFib3V0IFdvbWVuIHZzLiBIZWFkbGluZXMgYWJvdXQgb3RoZXIgdG9waWNzIiwKICAgICAgIHkgPSAiIiwKICAgICAgIHggPSAiUG9sYXJpdHkiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKClRocmVlIGV4YW1wbGVzIG9mIGhlYWRsaW5lcyB3aXRoIG5vIGNhbGN1bGF0ZWQgYmlhcwoKYGBge3J9Cmxhc3RfdGhyZWVfaGVhZGxpbmVzIDwtIGhlYWRsaW5lX2V4YW1wbGVzICU+JSAKICByZW5hbWUoIkhlYWRsaW5lIiA9IGBoZWFkbGluZV9ub19zaXRlYCwKICAgICAgICAgIlNpdGUiID0gYHNpdGVgLAogICAgICAgICAiQ291bnRyeSIgPSBgY291bnRyeWAsCiAgICAgICAgICJCaWFzIiA9IGBiaWFzYCkgJT4lCiAgYXJyYW5nZShgQmlhc2ApICU+JQogIGRpc3RpbmN0KFNpdGUsIC5rZWVwX2FsbCA9IFRSVUUpICU+JSAKICBzbGljZSgxOjMpICU+JSAKICBzZWxlY3QoYEhlYWRsaW5lYCwgYFNpdGVgLCBgQ291bnRyeWAsIGBCaWFzYCkKCmxhc3RfdGhyZWVfaGVhZGxpbmVzX3RhYmxlIDwtIGd0KGxhc3RfdGhyZWVfaGVhZGxpbmVzKSAlPiUgCiAgdGFiX2hlYWRlcih0aXRsZSA9ICJMZWFzdCBCaWFzZWQgSGVhZGxpbmUgRXhhbXBsZXMiKSAlPiUgCiAgZGF0YV9jb2xvcihjb2x1bW5zID0gdmFycyhgSGVhZGxpbmVgLCBgU2l0ZWAsIGBDb3VudHJ5YCwgYEJpYXNgKSwgCiAgICAgICAgICAgICBjb2xvcnMgPSAnI2JjY2FlMCcpCgpsYXN0X3RocmVlX2hlYWRsaW5lc190YWJsZQpgYGAKCgpUaHJlZSBleGFtcGxlcyBvZiBoaWdobHkgYmlhc2VkIGhlYWRsaW5lcwoKYGBge3J9CnRvcF90aHJlZV9oZWFkbGluZXMgPC0gaGVhZGxpbmVfZXhhbXBsZXMgJT4lIAogIHJlbmFtZSgiSGVhZGxpbmUiID0gYGhlYWRsaW5lX25vX3NpdGVgLAogICAgICAgICAiU2l0ZSIgPSBgc2l0ZWAsCiAgICAgICAgICJDb3VudHJ5IiA9IGBjb3VudHJ5YCkgJT4lIAogIG11dGF0ZShCaWFzID0gcm91bmQoYmlhcywgZGlnaXRzID0gMykpICU+JSAKICBhcnJhbmdlKGRlc2MoYEJpYXNgKSkgJT4lCiAgZGlzdGluY3QoU2l0ZSwgLmtlZXBfYWxsID0gVFJVRSkgJT4lIAogIHNsaWNlKDE6MykgJT4lIAogIHNlbGVjdChgSGVhZGxpbmVgLCBgU2l0ZWAsIGBDb3VudHJ5YCwgYEJpYXNgKQoKdG9wX3RocmVlX2hlYWRsaW5lc190YWJsZSA8LSBndCh0b3BfdGhyZWVfaGVhZGxpbmVzKSAlPiUgCiAgdGFiX2hlYWRlcih0aXRsZSA9ICJNb3N0IEJpYXNlZCBIZWFkbGluZSBFeGFtcGxlcyIpICU+JSAKICBkYXRhX2NvbG9yKGNvbHVtbnMgPSB2YXJzKGBIZWFkbGluZWAsIGBTaXRlYCwgYENvdW50cnlgLCBgQmlhc2ApLCAKICAgICAgICAgICAgIGNvbG9ycyA9ICcjYmNjYWUwJykKCnRvcF90aHJlZV9oZWFkbGluZXNfdGFibGUKYGBgCgoKClBPTEFSSVRZIENBTENVTEFUSU9OUwpXZSBtZWFzdXJlIHBvbGFyaXR5IGJ5IHBlcmZvcm1pbmcgc2VudGltZW50IGFuYWx5c2lzIG9uIGVhY2ggaGVhZGxpbmUgdXNpbmcgdGhlIFZhZGVyIHB5dGhvbiBwYWNrYWdlLCB3aGVyZSBlYWNoIGhlYWRsaW5lIGdldHMgYSBzZW50aW1lbnQgc2NvcmUgZnJvbSAtMSB0byAxIChmcm9tIG1vcmUgbmVnYXRpdmUgdG8gbW9yZSBwb3NpdGl2ZSkuIEJlY2F1c2Ugd2UgYXJlIGludGVyZXN0ZWQgaW4gcG9sYXJpdHksIHdlIHRha2UgdGhlIGFic29sdXRlIHZhbHVlIG9mIGVhY2ggaGVhZGxpbmUncyBzY29yZS4KCkJJQVMgQ0FMQ1VMQVRJT05TCldlIG1lYXN1cmUgZ2VuZGVyIGJpYXMgYnkgdHJhY2tpbmcgdGhlIGNvbWJpbmVkIG9jY3VycmVuY2Ugb2YgZ2VuZGVyZWQgbGFuZ3VhZ2UgYW5kIHNvY2lhbCBzdGVyZW90eXBlcyB1c3VhbGx5IGFzc29jaWF0ZWQgd2l0aCB3b21lbi4gV2UgZG8gdGhpcyBpbiB0d28gc3RlcHM6CjEpIFdlIGNoZWNrIGlmIGEgaGVhZGxpbmUgY29udGFpbnMgZ2VuZGVyZWQgbGFuZ3VhZ2UgKGkuZS4g4oCcc3Bva2Vzd29tYW4s4oCdIOKAnGNoYWlyd29tYW4s4oCdIOKAnHNoZSzigJ0g4oCcaGVyLOKAnSDigJxicmlkZSzigJ0g4oCcZGF1Z2h0ZXIs4oCdIOKAnGRhdWdodGVycyzigJ0g4oCcZmVtYWxlLOKAnSDigJxmaWFuY2VlLOKAnSDigJxnaXJsLOKAnSDigJxnaXJsZnJpZW5k4oCdIGV0Yy4pLgoyKSBJZiBpdCBjb250YWlucyBnZW5kZXJlZCBsYW5ndWFnZSwgd2UgdGhlbiBjb3VudCB0aGUgbnVtYmVyIG9mIHdvcmRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc29jaWFsIHN0ZXJlb3R5cGVzIGFib3V0IHdvbWVuIChpLmUuIOKAnHdlYWss4oCdIOKAnG1vZGVzdCzigJ0g4oCcdmlyZ2luLOKAnSDigJxzbHV0LOKAnSDigJx3aG9yZSzigJ0g4oCcc2V4eSzigJ0g4oCcZmVtaW5pbmUs4oCdIOKAnHNlbnNpdGl2ZSzigJ0g4oCcZW1vdGlvbmFsLOKAnSDigJxnZW50bGUs4oCdIOKAnHNvZnQs4oCdIOKAnHByZXR0eSzigJ0g4oCcYml0Y2gs4oCdIOKAnHNleHVhbOKAnSBldGMuKS4KRmluYWxseSwgd2Ugbm9ybWFsaXplIHRoaXMgY291bnQgZm9yIGFsbCBoZWFkbGluZXMgd2l0aGluIGVhY2ggb3V0bGV0IGFzIGEgc2NvcmUgYmV0d2VlbiAwIGFuZCAxLCBhbmQgd2UgYWdncmVnYXRlIChpLmUuIGF2ZXJhZ2UpIHRoaXMgc2NvcmUgZm9yIGVhY2ggb3V0bGV0Lgooc2l0ZSBmcm9tIHB1ZGRpbmcgaHR0cHM6Ly9wdWRkaW5nLmNvb2wvMjAyMi8wMi93b21lbi1pbi1oZWFkbGluZXMvKQoKCg==